# -*- coding: utf-8 -*-
# @Time    : 2024/7/10 11:55
# @Author  : yujiahao
# @File    : 11_fastapi_request_body_eg.py
# @description: 看一些模式信息的额外例子
from typing import Annotated

from fastapi import FastAPI, Body
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    '''

    todo 2、Field 的附加参数
    在 Field, Path, Query, Body 和其他你之后将会看到的工厂函数，你可以为JSON 模式声明额外信息，
    你也可以通过给工厂函数传递其他的任意参数来给JSON 模式声明额外信息，比如增加 example:
    请记住，传递的那些额外参数不会添加任何验证，只会添加注释，用于文档的目的。

    在 FastAPI 和 Pydantic 中，model_config 中的 json_schema_extra 和 Field 函数中的 examples 参数都用于生成 OpenAPI 文档中的示例数据，但它们的作用范围和优先级有所不同。

    优先级和作用范围
        Field 函数中的 examples：

            - 作用范围：字段级别。每个字段可以单独定义其示例数据。
            - 优先级：如果只定义了字段级别的 examples，这些示例数据将用于生成 OpenAPI 文档中的字段示例。

        model_config 中的 json_schema_extra：

            - 作用范围：模型级别。可以为整个模型定义一个或多个示例数据。
            - 优先级：当定义了 json_schema_extra 时，这些示例数据将覆盖字段级别的 examples，用于生成 OpenAPI 文档中的请求体示例。
    '''
    name: str = Field(examples=["Foo"])
    description: str | None = Field(default=None, examples=["通过字段来的"])
    price: float = Field(examples=[35.4])
    tax: float | None = Field(default=None, examples=[3.2])

    # todo 1、在JSON模式中定义额外的信息。

    # 使用 Config 和 schema_extra 为Pydantic模型声明一个示例,这些额外的信息将按原样添加到输出的JSON模式中。
    model_config = {
        "json_schema_extra": {
            "examples": [
                {
                    "name": "Foo",
                    "description": "A very nice Item",
                    "price": 2222.22,
                    "tax": 1111.11,
                    "随便写": "hhh"
                }
            ]
        }
    }


@app.put("/items/{item_id}")
async def update_item(
        item_id: int,
        item: Annotated[
            Item,
            Body(
                examples=[
                    {
                        "name": "Foo",
                        "description": "这个是body里面的东西",
                        "price": 35.4,
                        "tax": 3.2,
                    }
                ],
            ),
        ],
):
    '''

    todo 3、Body 额外参数
    你可以通过传递额外信息给 Field 同样的方式操作Path, Query, Body等。
    示例数据的优先级
        - Body 函数中的 examples：优先级最高，用于请求体级别的示例数据。
        - model_config 中的 json_schema_extra：次高优先级，用于模型级别的示例数据。
        - Field 函数中的 examples：最低优先级，用于字段级别的示例数据。

    '''
    results = {"item_id": item_id, "item": item}
    return results
